/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package ejb;

import entity.Article;
import entity.Groups;
import entity.Post;
import entity.User;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * Controller fungiert als Vermittler zwischen der View und dem Bean
 * 
 * @author Raphael
 */
@Stateless //bei jeder Session neu erstellt
public class EntityManagement {
    @PersistenceContext(unitName ="MeinWikiPU")
    private EntityManager em;
    
   /**
   * Schreibt ein Objekt in der Datenbank fest
   * @author Raphael
   *	 
   */
    public void persist(Object object){
        getEm().persist(object); //Exception weiterreichen
    }
    public void update(Object object) {
        getEm().merge(object);
    }
   /**
   * Ruft Liste der Artikel aus der Datenbank auf
   * @author Raphael
   *	 
   * @return Liste von Artikeln
   */
    public List<Article> getAllArticle() {
        return em.createQuery("SELECT a FROM Article a", Article.class).getResultList();        
    }
    
    /**
   * Sucht eine Liste von Artikeln aus der batenbank die auf den Suchtext zutreffen
   * @author Patrick
   *	 
   * @return Liste von Artikeln
   */
    public List<Article> searchArticle(String text) {
        String sqlText="SELECT a FROM Article a WHERE LOWER(a.theme) LIKE LOWER('%"+text+"%')";
        return em.createQuery(sqlText, Article.class).setMaxResults(10).getResultList();        
    }
    
     /**
   * Sucht die letzten 10 Artikel raus
   * @author Patrick
   *	 
   * @return Liste von Artikeln
   */
    public List<Article> LastTen() {
        String sqlText="SELECT a FROM Article a ORDER BY a DESC ";
       
        return em.createQuery(sqlText, Article.class).setMaxResults(10).getResultList();        
    }
    
     /**
   * Sucht den letzten Artikel
   * @author Patrick
   *	 
   * @return Liste von Artikeln
   */
    public Article latestArticle() {
         String sqlText="SELECT a FROM Article a ORDER BY a DESC ";
       
        List<Article> b =em.createQuery(sqlText, Article.class).setMaxResults(1).getResultList();  
        if(b==null){
            return null;
        }else{
        return b.get(0);
    }
    }
    
    
    /**
   * Sucht einen zufälligen Artikel
   * @author Patrick
   *	 
   * @return Liste von Artikeln
   */
    public Article randomArticle() {
        List<Article> b= getAllArticle();
        int x =randomNumber(0,b.size()); 
        if(b==null){
            return null;
        }else{
        return  b.get(x);
        }
    }
    
    public static int randomNumber(int low, int high) {
		return (int) (Math.random() * (high - low) + low);
	}
    
   /**
   * Ruft Liste der Artikel von einem Benutzer aus der Datenbank auf
   * @author Raphael
   * @param id
   *	 
   * @return Liste von Artikeln eines Benutzers
   */
    public List<Post> getUserPosts(String name) {
        //TODO Richtigkeit überprüfen anhand Testdaten!
        return em.createQuery("SELECT a FROM Post WHERE CREATOR_ID = id", Post.class).getResultList();
    }
    /**
   * Ruft Liste der Posts auf
   * @author Raphael
   *	 
   * @return Liste von Posts
   */
    public List<Post> getAllPosts(){
        return em.createQuery("SELECT a FROM Post a", Post.class).getResultList();
    }
    

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    
    public Article getArticle(String id){
       return em.find(Article.class, Integer.parseInt(id));       
    }
    
    public Post getPost(String id){
       return em.find(Post.class, Integer.parseInt(id));
    }
    public User getUser(String id){
       return em.find(User.class, id);
    }
     public Groups getGroup(String id){
         List<Groups> tmp = em.createQuery("SELECT a FROM Groups a WHERE a.groupid = '"+id+"'", Groups.class).setMaxResults(1).getResultList();
       if(tmp.isEmpty()){
           return null;
       }else{
         return tmp.get(0);
       }
    }
    
}
